package com.cn.JUC.utils.case13;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/**
 * @Title Fork/Join：Fork 对应的是分治任务模型里的任务分解，Join 对应的是结果合并。
 * @Description 分治计算斐波那契数列
 * @Author CAI ZHAI
 * @Date 2021/9/9 15:03
 **/
public class FibonacciImpl{
    public static void main(String[] args){
        //创建分治任务线程池
        ForkJoinPool fjp = new ForkJoinPool(4);
        //创建分治任务
        Fibonacci fib = new Fibonacci(30);
        //启动分治任务
        Integer result = fjp.invoke(fib);
        //输出结果
        System.out.println(result);
    }
    //递归任务
    static class Fibonacci extends RecursiveTask<Integer>{
        final int n;
        Fibonacci(int n){
            this.n = n;
        }
        protected Integer compute(){
            if (n <= 1) return n;
            
            Fibonacci f1 = new Fibonacci(n - 1);
            //创建子任务
            f1.fork();
            Fibonacci f2 = new Fibonacci(n - 2);
            //等待子任务结果，并合并结果
            return f2.compute() + f1.join();
        }
    }
}
